SPB Git
1.8 KB · 22 lines typescript
1import { z } from "zod";2import { handler, parseBody, uuid } from "@/lib/api";3import { db, schema } from "@/db";4import { and, desc, eq } from "drizzle-orm";5import { getPage, updatePage } from "@/lib/pages/service";6import { audit } from "@/lib/audit";7export const GET = handler(async ({ ws, params, req }) => {8  const id = uuid.parse(params.id); await getPage(ws.id, id, { includeDeleted: true });9  const v = new URL(req.url).searchParams.get("v");10  if (v) { const [row] = await db.select().from(schema.pageVersions).where(and(eq(schema.pageVersions.pageId, id), eq(schema.pageVersions.version, Number(v)))); return Response.json(row ?? null); }11  return Response.json(await db.select({ id: schema.pageVersions.id, version: schema.pageVersions.version, title: schema.pageVersions.title, reason: schema.pageVersions.reason, createdAt: schema.pageVersions.createdAt, wordCount: schema.pageVersions.wordCount }).from(schema.pageVersions).where(eq(schema.pageVersions.pageId, id)).orderBy(desc(schema.pageVersions.version)).limit(200));12});13/** POST { version } → restore that snapshot (current state is saved as a version first). */14export const POST = handler(async ({ ws, params, req, user }) => {15  const id = uuid.parse(params.id); const { version } = await parseBody(req, z.object({ version: z.number().int() }));16  const [row] = await db.select().from(schema.pageVersions).where(and(eq(schema.pageVersions.pageId, id), eq(schema.pageVersions.version, version)));17  if (!row) return Response.json({ error: "Version not found" }, { status: 404 });18  const p = await updatePage(ws.id, id, { title: row.title, content: row.content as any, properties: (row.properties ?? {}) as any }, { versionReason: `restore v${version}` });19  await audit(user.id, "page.restore_version", { type: "page", id }, { version });20  return Response.json({ ok: true, version: p.version });21});22
Files · main
Menu

Theme